import java.util.*;

/**
 * @author LKQ
 * @date 2021/12/28 9:23
 * @description 两个数组不排序直接计算
 */
public class Solution {
    public static void main(String[] args) {
        Solution solution = new Solution();
        int[] nums1 = {4, 9, 5}, nums2 = {9, 4,9,8,4};
        solution.intersect(nums1, nums2);
    }

    public int[] intersect(int[] nums1, int[] nums2) {
        // 这里因为Map存储较小的数组数字，所以需要判断谁小，但是可以直接化简成
        // if（num1.length > nums2.length) return intersect(nums2, nums1),反调一次。
        int m = nums1.length, n = nums2.length;
        int min = Math.min(m, n);
        Map<Integer, Integer> map = new HashMap<>();
        List<Integer> list = new ArrayList<>();
        if (min == m) {
            // nums1数组长度小
            for (int a : nums1) {
                if (!map.containsKey(a)) {
                    map.put(a, 1);
                }else {
                    map.put(a, map.get(a) + 1);
                }
            }
            for (int value : nums2) {
                if (map.containsKey(value) && map.get(value) > 0) {
                    list.add(value);
                    map.put(value, map.get(value) - 1);
                }
            }
        }else {
            // nums2数组长度小
            for (int b: nums2) {
                if (!map.containsKey(b)) {
                    map.put(b, 1);
                }else {
                    map.put(b, map.get(b) + 1);
                }
            }
            for (int value : nums1) {
                if (map.containsKey(value) && map.get(value) > 0) {
                    list.add(value);
                    map.put(value, map.get(value) - 1);
                }
            }
        }
        int[] ans = new int[list.size()];
        for (int i = 0; i < list.size(); i++) {
            ans[i] = list.get(i);
        }
        return ans;
    }

    public int[] intersect2(int[] nums1, int[] nums2) {
        // 对不排序方法进行优化
        if (nums1.length > nums2.length) {
            return intersect(nums2, nums1);
        }
        // 更换之后确保nums1长度小于nums2
        Map<Integer, Integer> map = new HashMap<>();
        List<Integer> list = new ArrayList<>();
        // nums1数组长度小
        for (int a : nums1) {
            // 化简If else
            int count = map.getOrDefault(a, 0) + 1;
            map.put(a, count);
        }
        for (int value : nums2) {
            if (map.containsKey(value) && map.get(value) > 0) {
                list.add(value);
                map.put(value, map.get(value) - 1);
            }
        }
        int[] ans = new int[list.size()];
        for (int i = 0; i < list.size(); i++) {
            ans[i] = list.get(i);
        }
        return ans;
    }
}
